package com.demo.common.redis.pubsub;

import cn.hutool.extra.spring.SpringUtil;
import com.demo.common.redis.MsgUtil;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;

/**
 * <p>
 * 自定义的基础消息订阅 (pub/sub模式)
 * </p>
 *
 * @author molong
 * @date 2022/6/22
 */
@Slf4j
public abstract class BaseSubMessageDelegate<T> {

    /**
     * 获取订阅消息的通道
     * @return 获取结果
     */
    public abstract String getChannel();

    /**
     * 序列化与反序列化对象
     */
    protected ObjectMapper objectMapper;

    /**
     * 获取序列化与反序列化器
     * @return 获取结果
     */
    protected ObjectMapper getObjectMapper(){
        if(objectMapper == null){
            objectMapper = SpringUtil.getBean(ObjectMapper.class);
        }
        return objectMapper;
    }

    /**
     * 反序列化
     * @return 反序列化结果
     */
    protected T deserialization(String text){
        return MsgUtil.deserialization(text, getObjectMapper(), getTypeReference());
    }

    /**
     * 获取反序列化具体的类型
     * <code>
     *     return new TypeReference<TestObject>() {};
     * </code>
     * @return 获取结果
     */
    public abstract TypeReference<T> getTypeReference();

    /**
     * 消息处理方法入口
     * @param text      处理内容
     * @param channel   通道
     */
    public void handleMessage(String text, String channel) {
        T deserialization = deserialization(text);
        onMessage(deserialization);
    }

    /**
     * 子类自己实现的消息处理
     * @param msg 消息
     */
    public abstract void onMessage(T msg);

}
